# 初始化项目前缀变量
set(NXPROJ_PREFIX "")

# 初始化项目设置的函数
function(nxproject_init)
    # 打印项目名称
    message(STATUS "[${PROJECT_NAME}]")
    # 更新项目前缀变量并确保其变化在父作用域中可见
    set(NXPROJ_PREFIX "${NXPROJ_PREFIX}-" PARENT_SCOPE)
endfunction() # nxsolution

# 创建新项目的函数
function(nxproject proj_name)
    # 使用提供的名称创建项目
    project(${proj_name})
    # 打印带有前缀的项目名称
    message(STATUS "${NXPROJ_PREFIX}[${PROJECT_NAME}]")
    # 更新项目前缀变量并确保其变化在父作用域中可见
    set(NXPROJ_PREFIX "${NXPROJ_PREFIX}-" PARENT_SCOPE)
    # 设置PROJECT_NAME变量的值为当前PROJECT_NAME的值，并将此值传递给父作用域
    set(PROJECT_NAME "${PROJECT_NAME}" PARENT_SCOPE)
endfunction() # nxproject

# 向目标项目添加子目录源文件的函数
function(nxproject_add_subdir target sub_dir)
    # 获取子目录中的所有.cpp文件
    file(GLOB sub_src_files ${sub_dir}/*.cpp)
    # 向目标项目公开添加源文件
    target_sources(${target} PRIVATE ${sub_src_files})
    # 向目标项目公开添加子目录作为包含目录
    target_include_directories(${target} PRIVATE ${sub_dir})
endfunction() # nxproject_add_subdir

# 创建动态库项目
function(nxproject_library proj_name)
    # 使用提供的名称创建项目
    project(${proj_name})
    # 打印带有前缀的项目名称
    message(STATUS "${NXPROJ_PREFIX}[${PROJECT_NAME}] Library")
    # 以项目名加入一个动态库
    add_library(${proj_name} SHARED ${proj_name}.h dllmain.cpp)
    # 设置预编译头文件
    target_precompile_headers(${proj_name} PRIVATE pch.h)
    # 更新项目前缀变量并确保其变化在父作用域中可见
    set(NXPROJ_PREFIX "${NXPROJ_PREFIX}-" PARENT_SCOPE)
    # 设置PROJECT_NAME变量的值为当前PROJECT_NAME的值，并将此值传递给父作用域
    set(PROJECT_NAME "${PROJECT_NAME}" PARENT_SCOPE)
endfunction() # nxproject_library

# 创建执行程序项目
function(nxproject_executable proj_name)
    # 使用提供的名称创建项目
    project(${proj_name})
    # 打印带有前缀的项目名称
    message(STATUS "${NXPROJ_PREFIX}[${PROJECT_NAME}] execute")
    # 以项目名加入一个动态库
    add_executable(${proj_name} main.cpp)
    # 设置预编译头文件
    target_precompile_headers(${proj_name} PRIVATE pch.h)
    # 更新项目前缀变量并确保其变化在父作用域中可见
    set(NXPROJ_PREFIX "${NXPROJ_PREFIX}-" PARENT_SCOPE)
    # 设置PROJECT_NAME变量的值为当前PROJECT_NAME的值，并将此值传递给父作用域
    set(PROJECT_NAME "${PROJECT_NAME}" PARENT_SCOPE)
endfunction() # nxproject_library

# 链接其他模块
function(nxproject_link_module target module_path)
    # 这样链接的库，没有依赖关系，所以不适用，脚本保留参考
    # find_library(LXWINE_LIBRARY NAME LxWine PATHS ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY})
    # target_link_libraries(NxBasic PRIVATE ${LXWINE_LIBRARY})

    # TODO 下面的注释的脚本为AI生成无用，以后可以学习下
    # # 获取模块的库文件
    # get_target_property(module_lib ${module_name} LOCATION)
    # # 将库文件添加到目标项目中
    # target_link_libraries(${target} ${module_lib})

    # 添加模块的include目录
    target_include_directories(${target} PRIVATE ${CMAKE_SOURCE_DIR}/${module_path})
    # 获取模块名称
    get_fileName_component(module_name ${module_path} NAME) 
    # 链接模块
    target_link_libraries(${target} PRIVATE ${module_name})
    # 打印链接信息
    message(STATUS "${NXPROJ_PREFIX} link ${module_name} = ${CMAKE_SOURCE_DIR}/${module_path}")
endfunction()

# 参考代码，以后也许有需要
# 设置输出名（可选）
# set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "${PROJECT_NAME}")
# # 导出符号（Windows 特定）
# if(WIN32)
#     set_target_properties(${PROJECT_NAME} PROPERTIES DEFINE_SYMBOL "${PROJECT_NAME}_EXPORTS")
# endif()

# 设置安装
# install(TARGETS ${PROJECT_NAME}
#         LIBRARY DESTINATION lib
#         ARCHIVE DESTINATION lib
#         RUNTIME DESTINATION bin)